package com.beidu.lottery.call.controller;

import com.alibaba.fastjson.JSONObject;
import com.beidu.lottery.call.constant.ActivityTypeEnum;
import com.beidu.lottery.call.entity.dto.LotteryLeaveNumDTO;
import com.beidu.lottery.call.result.Res;
import com.beidu.lottery.call.service.portal.UserDataService;
import com.beidu.lottery.call.service.portal.validator.impl.StatusValidator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.constraints.NotNull;

/**
 * <p>
 * 用户活动数据 前端控制器
 * </p>
 *
 * @author 北渡
 * @since 2023-08-23
 */
@Slf4j
@RestController
@RequestMapping("/user")
public class UserDataController {

    @Resource
    private UserDataService userDataService;

    @Resource
    private StatusValidator statusValidator;

    /**
     * 查询用户积分
     *
     * @author 北渡
     */
    @GetMapping("/queryPoints")
    public Res<Long> queryPoints() {
        return Res.success(userDataService.queryUserPoints());
    }

    /**
     * 查询剩余报名名额-字符串
     *
     * @param id 活动ID
     * @return 字符串格式："n/max"
     * @author 北渡
     */
    @GetMapping("/queryRegQuotaString")
    public Res<String> queryRegQuotaString(@NotNull @RequestParam("id") Integer id) {
        statusValidator.statusValidate(id, ActivityTypeEnum.REG);// 上下架校验
        return Res.success(userDataService.queryRegRemainingQuotaString(id));
    }

    /**
     * 查询剩余投票次数（当日或总数）
     *
     * @param id 活动ID
     * @author 北渡
     */
    @GetMapping("/queryVoteTimes")
    public Res<Integer> queryVoteTimes(@NotNull @RequestParam("id") Integer id) {
        statusValidator.statusValidate(id, ActivityTypeEnum.VOTE);// 上下架校验
        return Res.success(userDataService.queryVoteRemainingTimes(id));
    }

    /**
     * 查询剩余抽奖次数（当日或总数）
     *
     * @param req 查询参数
     * @author 北渡
     */
    @PostMapping("/queryLotteryTimes")
    public Res<Integer> queryLotteryTimes(@RequestBody LotteryLeaveNumDTO req) {
        log.info("queryLotteryTimes request==>{}", JSONObject.toJSONString(req));
        statusValidator.statusValidate(req.getActivityId(), ActivityTypeEnum.LOTTERY);// 上下架校验
        return Res.success(userDataService.queryLotteryLeaveNumBloomFilter(req));
    }

    /**
     * 增加用户抽奖次数
     *
     * @param req 查询参数
     * @author 北渡
     */
    @PostMapping("/addLotteryTimes")
    public Res addLotteryTimes(@RequestBody LotteryLeaveNumDTO req) {
        log.info("addLotteryTimes request==>{}", JSONObject.toJSONString(req));
        statusValidator.statusValidate(req.getActivityId(), ActivityTypeEnum.LOTTERY);// 上下架校验
        userDataService.addLotteryTimes(req);
        return Res.success();
    }

    /**
     * 添加活动id到布隆过滤器中
     *
     * @param req 查询参数
     * @author 北渡
     */
    @PostMapping("/addActivity")
    public Res addActivityId(@RequestBody LotteryLeaveNumDTO req) {
        log.info("addActivity request==>{}", JSONObject.toJSONString(req));
        userDataService.addActivityId(req);
        return Res.success();
    }

}
